package com.flute.framework.data;

import java.util.List;

import com.flute.framework.StandardDate;
import com.flute.framework.exception.IndexException;
import com.flute.tools.data.DataIterator;
import com.flute.tools.data.DataRecord;

/**
 * 索引数据源接口。每个索引的过程以此接口作为数据来源
 * 
 * 支持对数据的恢复操作，使得索引回滚到特定的时间点
 * 
 * 
 * @author Dave Yang
 * 
 */
public interface IIndexData {
	/**
	 * 开始数据提供的事务
	 */
	public void openTransaction() throws IndexException;

	/**
	 * 处理索引数据
	 * 
	 * @param data
	 *            封装了索引信息的对象
	 */
	public void processData(DataRecord data) throws IndexException;

	/**
	 * 提交事务
	 */
	public void commit() throws IndexException;

	/**
	 * @return 所有的数据源时间
	 */
	public List<StandardDate> getAllDates() throws IndexException;

	/**
	 * 得到截止至该时间点的所有数据
	 * 
	 * @param date
	 *            特定时间点
	 * @return
	 */
	public DataIterator<DataRecord> getDataRecords(StandardDate date)
			throws IndexException;

	/**
	 * 返回当前时间所有的数据
	 * 
	 * @param isUpdate
	 *            true返回最新的数据，false返回所有的数据
	 * @return
	 */
	public DataIterator<DataRecord> getCurrentDataRecords(boolean isUpdate)
			throws IndexException;

	/**
	 * 把数据回滚到特定时间，晚于这个时间的数据都被抛弃
	 * 
	 * TODO：在索引回滚的过程中，是否数据也需回滚？
	 * 
	 * @param date
	 */
	public void roolbackTo(StandardDate date) throws IndexException;

	public DataRecord getLatestDataRecordByKey(String key);
}
